package Java_API;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class ATM {
    //定义一个array list容器来装账户对象
    private ArrayList<Accunt> user = new ArrayList<>();
    private Scanner sc = new Scanner(System.in);
    //在这里定义一个成员变量，用来对登录成功后的账户，进行操作，也就是showcmd方法
    private Accunt loginacc = new Accunt();
    Random r = new Random();
    //设计一个方法，实现用户开户功能
    private void creat(){
        //创建一个用户对象
        Accunt acc = new Accunt();
        //用户姓名输入
        System.out.println("请输入用户姓名");
        String name = sc.next();
        acc.setUsername(name);
        while (true) {
            //用户性别输入
            System.out.println("请输入用户性别");
            char sex = sc.next().charAt(0);
            //判断用户输入的是否有误
            if (sex == '男' || sex == '女'){
                acc.setSex(sex);
                break;
            }else {
                System.out.println("您输入的有误，请重新输入~~");
            }
        }
        while (true) {
            //用户密码输入
            System.out.println("请输入用户密码");
            String pwd = sc.next();
            System.out.println("请再次确认输入密码");
            String okpwd = sc.next();
            //判断两次输入密码是否相同
            if (okpwd.equals(pwd)){
                System.out.println("密码设置成功~~~");
                acc.setPassword(okpwd);
                break;
            }else {
                System.out.println("两次密码输入不一致，请重新输入");
            }
        }
        //设置最大取款限额
        System.out.println("请输入最大取款限额：");
        double limit = sc.nextDouble();
        acc.setLimit(limit);
        String newid = createID();
        acc.setCardid(newid);
        //把用户对象加入到容器中去
        user.add(acc);
        System.out.println("恭喜您"+acc.getUsername()+"用户开户成功~~"+"您的银行卡号是："+acc.getCardid());
    }
    //设计一个方法，实现一个八位用户卡号的生成
    private String  createID(){

        while (true) {
            String id = "";
            for (int i = 0; i < 8; i++) {
                 int date = r.nextInt(10);
                 id += date;
                 //在这里调用一下，justid函数，来确定是否要返回这个八位卡号
                }
            Accunt acc = justID(id);
            //如果返回值，是null就代表，随机生成的银行卡号，不重复
            if (acc == null){
                return id;
            }
        }
    }
    //判断随机生成的银行卡号是否存在,在这里要返回一个对象
    private Accunt justID(String id){
        //遍历这个容器，来查询，卡号是否已经存在
        for (int i = 0; i < user.size(); i++) {
            Accunt acc = user.get(i);
            if (acc.getCardid().equals(id)){
                return acc;
            }
        }
        return null;
    }
    //设计一个方法，实现用户登录功能
    public void login(){
        //用户登录功能
        while (true) {
            System.out.println("请输入您的银行卡卡号：");
            String id = sc.next();
            //判断银行卡号是否存在于系统
            Accunt acc =  justID(id);
            if (acc == null){
                //说明用户不存在
                System.out.println("您输入的卡号不存在，请重新输入~~");
            }else{
                //用户存在
                System.out.println("请您输入密码：");
                String pwd = sc.next();
                //判断输入的密码是否正确
                if (acc.getPassword().equals(pwd)){
                    loginacc = acc;
                    System.out.println(loginacc.getUsername()+"登录成功"+"您的卡号是："+loginacc.getCardid());
                    showcmd();
                    return;
                }else {
                    System.out.println("密码输入有误，请您核验~");
                }
            }
        }
    }
    //设计一个方法，来展示用户登陆后的操作
    public void showcmd(){
        while (true) {
            System.out.println(loginacc.getUsername()+"您可以进行以下操作===");
            System.out.println("1、查询账户");
            System.out.println("2、存款");
            System.out.println("3、取款");
            System.out.println("4、转账");
            System.out.println("5、修改密码");
            System.out.println("6、退出");
            System.out.println("7、注销当前账户");
            System.out.println("请选择：");
            int op = sc.nextInt();
            switch (op){
                case 1:
                    showloginuser();//账户查询
                    break;
                case  2:
                    addmoney();
                    break;//存款
                case 3:
                    reducemoney();
                    break;//取款
                case 4:
                    transfermoney();
                    break;//转账
                case 5:
                    modifypwd();
                    break;//修改密码
                case 6://退出系统
                    System.out.println(loginacc.getUsername()+"欢迎下次使用黑马ATM系统~");
                    return;
                case 7:
                    //判断当前系统是否存在账户~
                    deluser();
                    return;
                default:
                    System.out.println("您输入的命令有错误，请核验~~");
            }
        }
    }

    private void deluser() {
        if (user.size() == 0){
            System.out.println("当前系统不存在账户，请去开户吧~~");
        }else {
            if (loginacc.getMoney() != 0){
                System.out.println("当前账户还有存款，不能销户~");
                }else {
                System.out.println("确认要注销当前账户吗？，输入y/n");
                String code = sc.next();
                if (code.equals("y")){
                    user.remove(loginacc);
                    System.out.println("用户销户成功");
                }
            }
            }
    }

    private void modifypwd() {
        System.out.println("欢迎使用密码修改功能~");
        while (true) {
            System.out.println("请输入原来的的银行卡密码：");
            String orpwd = sc.next();
            //判断一下，原来的密码是否正确
            if (loginacc.getPassword().equals(orpwd)){
                System.out.println("请输入新的银行卡密码：");
                String modpwd = sc.next();
                loginacc.setPassword(modpwd);
                System.out.println(loginacc.getUsername()+"密码修改成功");
                System.out.println("新的密码是："+loginacc.getPassword());
                return;
            }else {
                System.out.println("密码输入错误，请重新输入~");
                break;
            }
        }
    }

    private void transfermoney() {
        System.out.println("欢迎使用转账功能~");
        while (true) {
            if (user.size() < 2){
                System.out.println("当前系统只存在一个用户，不能进行转账操作,请去开户吧~~");
                return;
            }else {
                System.out.println("请输入您要转账的卡号");
                String transferid = sc.next();
                Accunt acc = justID(transferid);
                //判断这个卡号是否存在
                if (acc == null){
                    //说明输入的卡号在当前系统中不存在
                    System.out.println("您当前输入的卡号不存在，请核验后重新输入~~");
                    return;
                }else {
                    //卡号存在
                    String name = "*" + acc.getUsername().substring(1);
                    System.out.println("请输入"+name+"的姓氏");
                    String prename = sc.next();
                    if (acc.getUsername().startsWith(prename)){
                        System.out.println("请输入要转账的金额：");
                        double trmoney = sc.nextDouble();
                        if (loginacc.getMoney() < trmoney){
                            System.out.println("您自己都没钱，就别转了~~~，");
                            return;
                        }else {
                            loginacc.setMoney(loginacc.getMoney() - trmoney);
                            acc.setMoney(acc.getMoney() + trmoney);
                            System.out.println("恭喜您，给"+acc.getUsername()+"转账"+trmoney+"成功"+"您当前账户余额为："+loginacc.getMoney());
                            return;
                        }
                    }
                }
            }
        }
    }
    private void reducemoney() {
        System.out.println("欢迎使用取款操作~");
        System.out.println("请输入您的取款金额：");
        double delmoney = sc.nextDouble();
        //对取款金额进行判断
        if (loginacc.getMoney() < 100){
            System.out.println("您的账户余额不足100元，无法取款~");
            return;
        }
        while (true){
            if (loginacc.getMoney() < delmoney){
                System.out.println("您的余额不足，请充值后再来提现~");
                break;
            }else {
                //判断取款金额是否在每次取款额度之内
                if (loginacc.getLimit() < delmoney){
                    System.out.println("本次取款额度超过了每次取款限额，无法取款~~");
                    break;
                    }else {
                    loginacc.setMoney(loginacc.getMoney() - delmoney);
                    System.out.println("恭喜您："+loginacc.getUsername()+"取款"+delmoney+"成功");
                    System.out.println("您的账户当前的余额是："+loginacc.getMoney());
                    break;
                }
                }
            }
        }


    private void addmoney() {
        System.out.println("==欢迎进入存款操作~");
        System.out.println("请输入存款金额：");
        double money = sc.nextDouble();
        loginacc.setMoney(loginacc.getMoney() + money);
        System.out.println("恭喜您："+loginacc.getUsername()+"存款"+money+"成功");
        System.out.println("您当前账户的余额是："+loginacc.getMoney());
    }

    //设计一个方法，来展示已经登录的用户信息
    public void showloginuser(){
        System.out.println("姓名："+loginacc.getUsername());
        System.out.println("性别："+loginacc.getSex());
        System.out.println("卡号："+loginacc.getCardid());
        System.out.println("余额："+loginacc.getMoney());
        System.out.println("每次取现额度："+loginacc.getLimit());
    }
    //在ATM类中编写一个方法，来显示启动页
    public void start(){
        while (true) {
            System.out.println("===欢迎进入黑马银行===");
            System.out.println("1、用户开户");
            System.out.println("2、用户登录");
            System.out.println("请输入你要进行的操作");
            int option = sc.nextInt();
            switch (option){
                case 1:
                    creat();
                    System.out.println("欢迎使用用户开户功能");
                    break;
                case 2:
                    login();
                    System.out.println("欢迎使用用户登录功能");
                    break;
                default:
                    System.out.println("您输入的操作不存在，请重新输入~~");
            }
        }
    }
}